﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace physio.assist.DB
{
    /// <summary>
    /// Summary description for PhysioAssist
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class PhysioAssist : System.Web.Services.WebService
    {


        //Serviços
        [WebMethod]
        public int InsereLogVoz(DateTime Data, string Comando, int Profissional)
        {
            dsTableAdapters.logvozTableAdapter ta = new dsTableAdapters.logvozTableAdapter();
            ta.Insert(Data, Comando, Profissional);

            return PegaUltimoRegistro("logvoz");
        }


        [WebMethod]
        public int InsereMovimento(int Paciente, int Profissional, string Junta, double Angulo, double Tempo, DateTime Data)
        {
            dsTableAdapters.movimentoTableAdapter ta = new dsTableAdapters.movimentoTableAdapter();
            ta.Insert(Paciente, Profissional, Junta, Angulo, Tempo, Data);

            return PegaUltimoRegistro("movimento");
        }


        [WebMethod]
        public void InsereMovimentoLog(List<MovimentoLog> lst)
        {

            foreach (MovimentoLog log in lst)
            {

                dsTableAdapters.movimento_logTableAdapter ta = new dsTableAdapters.movimento_logTableAdapter();
                ta.Insert(log.Paciente, log.Profissional, log.Junta, log.X, log.Y, log.Z, log.Data);

            }

        }


        [WebMethod]
        public List<Agenda> ListaAgenda(int profissional, int dia, int mes, int ano)
        {


            List<Agenda> dados = new List<Agenda>();





            dsTableAdapters.agendaTableAdapter ta = new dsTableAdapters.agendaTableAdapter();
            ds.agendaDataTable dt = new ds.agendaDataTable();

            ta.Fill(dt);

            dt.DefaultView.RowFilter = "profissional = " + profissional + " and dia =  " + dia + " and mes =  " + mes + " and ano = " + ano;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Agenda ag = new Agenda();

                ag.Ano = ano;
                ag.Dia = dia;
                ag.Mes = mes;
                ag.Profissional = profissional;

                ag.Hora = dr["hora"].ToString();
                ag.Compromisso = dr["compromisso"].ToString();

                dados.Add(ag);

            }





            return dados;
        }


        [WebMethod]
        public List<Aniversario> ListaAniversario(int dia, int mes)
        {
            List<Aniversario> dados = new List<Aniversario>();


            dsTableAdapters.aniversarioTableAdapter ta = new dsTableAdapters.aniversarioTableAdapter();
            ds.aniversarioDataTable dt = new ds.aniversarioDataTable();

            ta.Fill(dt);

            dt.DefaultView.RowFilter = "dia =" + dia + " and mes = " + mes;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Aniversario aniversario = new Aniversario();
                aniversario.Dia = dia;
                aniversario.Mes = mes;
                aniversario.Nome = dr["nome"].ToString();

                dados.Add(aniversario);

            }


            return dados;
        }


        [WebMethod]
        public List<Noticia> ListaNoticia()
        {

            List<Noticia> dados = new List<Noticia>();


            dsTableAdapters.noticiaTableAdapter ta = new dsTableAdapters.noticiaTableAdapter();
            ds.noticiaDataTable dt = new ds.noticiaDataTable();

            ta.Fill(dt);

            dt.DefaultView.Sort = "data desc";

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Noticia noticia = new Noticia();

                noticia.Conteudo = dr["conteudo"].ToString();
                noticia.Data = DateTime.Parse(dr["data"].ToString());
                noticia.Fonte = dr["fonte"].ToString();
                noticia.Titulo = dr["titulo"].ToString();
                noticia.Url = dr["url"].ToString();
                noticia.Id = int.Parse(dr["id"].ToString());

                dados.Add(noticia);

            }


            return dados;

        }


        [WebMethod]
        public List<Anuncio> ListaAnuncio()
        {

            List<Anuncio> dados = new List<Anuncio>();


            dsTableAdapters.anuncioTableAdapter ta = new dsTableAdapters.anuncioTableAdapter();
            ds.anuncioDataTable dt = new ds.anuncioDataTable();

            ta.Fill(dt);

            dt.DefaultView.Sort = "data desc";

            dt.DefaultView.RowFilter = "[prazo] >= #" + FormataData(DateTime.Now) + "#";

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Anuncio anuncio = new Anuncio();

                anuncio.Data = DateTime.Parse(dr["data"].ToString());
                anuncio.Mensagem = dr["mensagem"].ToString();
                anuncio.Prazo = DateTime.Parse(dr["prazo"].ToString());
                anuncio.Profissional = int.Parse(dr["profissional"].ToString());

                dados.Add(anuncio);

            }

            return dados;

        }


        [WebMethod]
        public List<Mensagem> ListaMensagem(int profissional)
        {

            List<Mensagem> dados = new List<Mensagem>();

            dsTableAdapters.mensagemTableAdapter ta = new dsTableAdapters.mensagemTableAdapter();
            ds.mensagemDataTable dt = new ds.mensagemDataTable();

            ta.Fill(dt);

            dt.DefaultView.RowFilter = "profissional_para = " + profissional;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Mensagem mensagem = new Mensagem();

                mensagem.Data = DateTime.Parse(dr["data"].ToString());
                mensagem.MensagemTexto = dr["mensagem"].ToString();
                mensagem.ProfissionalDe = int.Parse(dr["profissional_de"].ToString());
                mensagem.ProfissionalPara = int.Parse(dr["profissional_para"].ToString());

                dados.Add(mensagem);

            }


            return dados;


        }


        [WebMethod]
        public List<Paciente> ListaPaciente()
        {

            List<Paciente> lst = new List<Paciente>();


            dsTableAdapters.pacienteTableAdapter ta = new dsTableAdapters.pacienteTableAdapter();
            ds.pacienteDataTable dt = new ds.pacienteDataTable();

            ta.Fill(dt);

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Paciente pac = new Paciente();

                pac.Foto = dr["foto"].ToString();
                pac.Id = int.Parse(dr["id"].ToString());
                pac.Nascimento = DateTime.Parse(dr["nascimento"].ToString());
                pac.Nome = dr["nome"].ToString();

                lst.Add(pac);

            }


            return lst;

        }


        [WebMethod]
        public Profissional GetProfissional(int id)
        {

            Profissional profissional = new Profissional();


            dsTableAdapters.profissionalTableAdapter ta = new dsTableAdapters.profissionalTableAdapter();
            ds.profissionalDataTable dt = new ds.profissionalDataTable();

            ta.Fill(dt);

            dt.DefaultView.RowFilter = "id = " + id;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Profissional prof = new Profissional();

                prof.Cargo = dr["cargo"].ToString();
                prof.Nome = dr["nome"].ToString();
                prof.Foto = dr["foto"].ToString();

                return prof;

            }

            return profissional;


        }


        [WebMethod]
        public Paciente GetPaciente(int id)
        {

            Paciente paciente = new Paciente();


            dsTableAdapters.pacienteTableAdapter ta = new dsTableAdapters.pacienteTableAdapter();
            ds.pacienteDataTable dt = new ds.pacienteDataTable();

            ta.Fill(dt);

            dt.DefaultView.RowFilter = "id = " + id;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Paciente pac = new Paciente();

                pac.Nome = dr["nome"].ToString();
                pac.Nascimento = DateTime.Parse(dr["nascimento"].ToString());
                pac.Foto = dr["foto"].ToString();

                return pac;

            }

            return paciente;


        }


        [WebMethod]
        public Noticia GetNoticia(int id)
        {

            Noticia noticia = new Noticia();

            dsTableAdapters.noticiaTableAdapter ta = new dsTableAdapters.noticiaTableAdapter();
            ds.noticiaDataTable dt = new ds.noticiaDataTable();

            ta.Fill(dt);

            dt.DefaultView.RowFilter = "id = " + id;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                Noticia noti = new Noticia();

                noti.Conteudo = dr["conteudo"].ToString();
                noti.Data = DateTime.Parse(dr["data"].ToString());
                noti.Fonte = dr["fonte"].ToString();
                noti.Titulo = dr["titulo"].ToString();
                noti.Url = dr["url"].ToString();

                return noti;

            }


            return noticia;

        }


        [WebMethod]
        public double Calcula(DateTime dataInicial, DateTime dataFinal, string anguloOUtempo, string MaxMinMedia, int paciente, string junta)
        {

            double retorno = 0;

            dsTableAdapters.movimentoTableAdapter ta = new dsTableAdapters.movimentoTableAdapter();
            ds.movimentoDataTable dt = new ds.movimentoDataTable();

            ta.Fill(dt);

            //Filtra os movimentos registrados entre o range de datas pedido
            dt.DefaultView.RowFilter = " [data] >= #" + FormataData(dataInicial) + "# and [data] <= #" + FormataData(dataFinal) + "# and paciente = " + paciente + " and junta = '" + junta + "'";

            //Variaveis auxiliares nos calculos
            int cont = 0;
            double min = 99999;
            double max = -99999;
            double soma = 0;

            foreach (System.Data.DataRowView dr in dt.DefaultView)
            {

                //Incrementa o contador (para calcular média)
                cont++;

                //Verifica se o valor é MENOR que o MINIMO
                if (double.Parse(dr[anguloOUtempo].ToString()) < min) min = double.Parse(dr[anguloOUtempo].ToString());

                //Verifica se o valor é MAIOR que o MAXIMO
                if (double.Parse(dr[anguloOUtempo].ToString()) > max) max = double.Parse(dr[anguloOUtempo].ToString());

                //Vai somando os valores na SOMA
                soma += double.Parse(dr[anguloOUtempo].ToString());

            }

            //Verifica qual o tipo de retorno, e retorna adequadamente
            if (MaxMinMedia == "max") return max;
            if (MaxMinMedia == "min") return min;
            if (MaxMinMedia == "media") return soma / cont;


            //Retorno padrão
            return retorno;

        }


        [WebMethod]
        public double Compara(DateTime dataInicialComparada, DateTime dataFinalComparada, DateTime dataInicialComparativa, DateTime dataFinalComparativa, string anguloOUtempo, string MaxMinMedia, string junta, int paciente)
        {

            //dataInicialComparada + dataFinalComparada = período base para a comparação
            //dataInicialComparativa + dataFinalComparativa = período novo que quer ser comparado ao antigo


            //Obtem valor base a ser comparado
            double valorBase = Calcula(dataInicialComparada, dataFinalComparada, anguloOUtempo, MaxMinMedia, paciente, junta);

            //Obtem valor que será comparado ao base
            double valorComparativo = Calcula(dataInicialComparativa, dataFinalComparativa, anguloOUtempo, MaxMinMedia, paciente, junta);

            //Compara valores
            return 100 - ((100 / valorComparativo) * valorBase);



        }







        //Auxiliares
        private int PegaUltimoRegistro(string Tabela)
        {

            int retorno = 0;


            if (Tabela == "logvoz")
            {
                dsTableAdapters.logvozTableAdapter ta = new dsTableAdapters.logvozTableAdapter();
                ds.logvozDataTable dt = new ds.logvozDataTable();

                ta.Fill(dt);
                dt.DefaultView.Sort = "id ascending";

                foreach (System.Data.DataRowView dr in dt.DefaultView)
                    retorno = int.Parse(dr["id"].ToString());

            }

            if (Tabela == "movimento")
            {
                dsTableAdapters.movimentoTableAdapter ta = new dsTableAdapters.movimentoTableAdapter();
                ds.movimentoDataTable dt = new ds.movimentoDataTable();

                ta.Fill(dt);
                dt.DefaultView.Sort = "id ascending";

                foreach (System.Data.DataRowView dr in dt.DefaultView)
                    retorno = int.Parse(dr["id"].ToString());

            }


            return retorno;

        }
        private string FormataData(DateTime data)
        {

            return data.Month.ToString() + "/" + data.Day.ToString() + "/" + data.Year.ToString();

        }






    }
}
